//`pkg-config --cflags --libs gtk+-2.0`    //编译标志
#include <gtk/gtk.h> //头文件
int main(int argc,char *argv[])    //主函数
{
	gtk_init(&argc,&argv[]);
	GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);    //有边框
	                                 GTK_WINDOW_POPUP    //无边框
	//控件操作
	gtk_widget_show(window);
	gtk_main();
	return 0;
}
void gtk_window_set_title(GtkWindow *window,const gchar *title);    //窗口标题
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height);    //窗口最小大小
void gtk_window_set_resizable(GtkWindow *window,gboolean resizable);    //窗口伸缩
void gtk_window_set_position(GtkWindow *window,GtkWindowPosition position);    //窗口位置
                                               GTK_WIN_POS_NONE
											   GTK_WIN_POS_CENTER
											   GTK_WIN_POS_MOUSE
											   GTK_WIN_POS_CENTER_ALWAYS
GdkPixbuf *gdk_pixbuf_new_from_file(const gchar *filename,GError **error);    //创建图片资源
                                                          NULL
GdkPixbuf *gdk_pixbuf_scale_simple(const GdkPixbuf *src,int dest_width,int dest_height,GdkInterpType interp_type);    //设置图片大小
                                                                                       GDK_INTERP_BILINEAR
void g_object_unref(GtkObject *object);    //释放资源
GtkWidget *gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf);    //通过资源创建图片控件
void gtk_image_set_from_pixbuf(GtkImage *image,GdkPixbuf *pixbuf);    //设置图片控件图片
void gtk_image_clear(GtkImage *image);    //清除图像控件里的图像数据
GtkWidget *gtk_button_new_with_lable(const gcahr *label);    //创建带内容按钮
void gtk_button_set_label(GtkButton *button,const gchar *label);    //设置按钮标签
const gchar *gtk_button_get_label(GtkButton *button);    //获取按钮标签
void gtk_widget_set_sensitive(GtkWidget *widget,gboolean sensitive);    //按钮使能
void gtk_button_set_image(GtkButton *button,GtkWidget *image);    //设置按钮图片
void gtk_button_set_relief(GtkButton *button,GtkReliefStyle newstyle);    //按钮透明度
                                             GTK_RELIEF_NONE    //按钮透明
void gtk_container_add(GtkContainer *container,GtkWidget *widget);    //容器附加控件
gulong g_signal_connect(gpointer instance,const gchar *detailed_signal,GCallback c_handler,gpointer data);    //信号连接回调
GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing);    //水平布局
GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing);    //垂直布局
GtkWidget *gtk_label_new(cost gchar *str);    //创建标签
void gtk_label_set_text(GtkLabel *label,const gchar *str);    //设置标签内容
const gchar *gtk_label_get_label(GtkLabel *label);    //获取标签内容
GtkWidget *gtk_table_new(guint rows,guint columns,gboolean homogeneous);    //表格布局
void gtk_table_attach_defaults(GtkTable *table,GtkWidget *widget,guint left_attach,guint right_attach,guint top_attach,guint bottom_attach);    //表格布局附加控件
GtkWidget *gtk_fixed_new();    //固定布局
void gtk_fixed_put(GtkFixed *fixed,GtkWidget *widget,gint x,gint y);    //固定布局附加控件
GtkWidget *gtk_entry_new(void);    //行编辑
gtk_entry_set_visibility(GtkEntry *entry,gboolean visible);    //行编辑显示
const gchar *gtk_entry_get_text(GtkEngry *entry);    //获取行编辑内容
void gtk_entry_set_text(GtkEngry *entry,const gchar *text);    //设置行编辑内容
"activate" //行编辑触发信号
GtkWidget *gtk_process_bar_new();    //进度条
void gtk_process_bar_set_fraction(GtkProgressBar *pbar,gdouble fraction);    //设置进度条百分比
void gtk_process_bar_set_text(GtkProgressBar *pbar,gchar *text);    //设置滑槽文本显示
void gtk_progress_bar_set_orientation(GtkProgressBar *pbar,GtkProgressBarOrientation orientation);    //设置进度条移动方向
                                                           GTK_PROGRESS_LEFT_TO_RIGHT
														   GTK_PROGRESS_RIGHT_TO_LEFT
														   GTK_PROGRESS_BOTTOM_TO_TOP
														   GTK_PROGRESS_TOP_TO_BOTTOM
GtkWidget *gtk_scrolled_window_new(GtkAdjustment *hadjustment,GtkAdjustment *vadjustment);    //滚动窗口
                                   NULL                       NULL
void gtk_scolled_window_set_policy(GtkScolledWindow *scrolled_window,GtkPolicyTypehscrollbar_policy,GtkPolicyType vscrollbar_policy);    //滚动条出现的方式
                                   GTK_POLICY_AUTOMATIC
								   GTK_POLICY_ALWAYS
								   GTK_POLICY_NEVER
GtkWidget *gtk_clist_new_with_titles(gint columns,gchar *titles[]);    //创建列表
void gtk_clist_set_column_width(GtkCList *clist,gint column,gint width);    //设置列宽
void gtk_clist_set_column_justification(GtkCList *clist,gint column,GtkJustification justification);    //对齐方式
                                                                    GTK_JUSTIFY_LEFT
																	GTK_JUSTIFY_RIGHT
																	GTK_JUSTIFY_CENTER
																	GTK_JUSTIFY_CENTER
gint gtk_clist_append(GtkCList *clist,gchar *text[]);    //列表添加行
void gtk_clist_clear(GtkCList *clist);    //清空列表所有行
gint gtk_clist_get_text(GtkCList *clist,gint row,gint column,gchar **text);    //获取某行某列内容
"select_row"    //列表行出发信号
guint g_timeout_add(guint interval,GSourceFunc function,gpointer data);    //创建定时器
gboolean g_source_remove(guint tag);    //移除定时器
void gtk_widget_add_events(GtkWidget *widget,gint events);    //控件捕获事件
                           GDK_BUTTON_PRESS_MASK
						   GDK_BUTTON_RELEASE_MASK
						   GDK_BUTTON_MOTION_MASK
						   GDK_KEY_PRESS_MASK
						   GDK_ENTER_NOTIFY_MASK
"button_press_event"    //鼠标点击事件信号
"button_release_event"    //鼠标释放事件信号
gboolean callback(GtkWidget *widget,GdkEventButton *event,gpointer data);    //鼠标点击事件回调
                                    event->x,event->y    //获取点击坐标值
									event->button    //1左键，2中键，3右键
									event->type    //双击GDK_2BUTTON_PRESS
				  return TRUE;
"motion_notify_event"    //鼠标移动事件信号
gboolean callback(GtkWidget *widget,GdkEventMotion *event,gpointer data);    //鼠标移动事件回调
                                    event->x,event->y    //获取移动坐标值
				  return TRUE;
"key_press_event"    //键盘按下事件的信号
"key_release_event"    //键盘释放事件的信号
gboolean callback(GtkWidget *widget,GdkEventKey *event,gpointer data);    //键盘按下事件回调
                                    event->keyval    //获取键值
				  return TRUE;
"expose_event"    //曝光事件信号
gboolean callback(GtkWidget *widget,GdkEventExpose *event,gpointer data);    //曝光事件回调
				  return FALSE;
#include <cairo.h>    //Cairo绘图头文件
void gtk_widget_set_app_paintable(GtkWidgte *widget,gboolean app_paintable);    //允许窗口绘图
cairo_t *gtk_cairo_create(GdkDrawable *drawable);    //创建Cairo环境
                          drawable->window
void cairo_destroy(cairo_t *cr);    //回收资源
void cairo_set_line_width(cairo_t *cr,double width);    //设置线宽
void cairo_set_source_rgb(cairo_t *cr,double r,double g,double b);    //设置颜色,r,g,b从0.0到1.0
void cairo_move_to(cairo_t *cr,double x,double y);    //设置直线起点
void cairo_line_to(cairo_t *cr,double x,double y);    //设置直线终点
void cairo_rectangle(cairo_t *cr,double x,double y,double width,double height);    //设置矩形路径
void cairo_stroke(cairo_t *cr);    //绘制cairo
void cairo_fill(cairo_t *cr);    //填充cairo闭合路径
void cairo_select_font_face(cairo_t *cr,const char *family,cairo_font_slant_t slant,cairo_font_weight_t weight);
                                        字体               倾斜                     加粗
void cairo_set_font_size(cairo_t *cr,double size);    //设置字体大小
void cairo_show_text(cairo_t *cr,const char *utf8);    //显示字符串
gdk_cairo_set_source_pixbuf(cairo_t *cr,const GdkPixbuf *pixbuf,double pixbuf_x,double pixbuf_y);    //设置画图图片
void cairo_paint(cairo_t *cr);    //绘制图片
void gtk_widget_queue_draw(GtkWidget *widget);    //刷新绘图区域
void gtk_thread_init(void)    //gtk创建线程前调用/*{{{*/
{
	if(FALSE == g_thread_supported())
	{ 
		g_thread_init(NULL); 
	}
	gdk_threads_init();
}/*}}}*/
void *pthread_fun(void *data)    //线程函数中操作界面需要封装/*{{{*/
{
	gdk_threads_enter();
	//一个或多个界面操作函数
	gdk_threads_leave();
}/*}}}*/
/* 功能：  设置背景图
 * widget: 主窗口
 * w, h:   图片的大小
 * path：  图片路径
 */
static void chang_background(GtkWidget *widget, int w, int h, const gchar *path)/*{{{*/
{
	gtk_widget_set_app_paintable(widget, TRUE);		//允许窗口可以绘图
    gtk_widget_realize(widget);	
	
	/* 更改背景图时，图片会重叠
	 * 这时要手动调用下面的函数，让窗口绘图区域失效，产生窗口重绘制事件（即 expose 事件）。
	 */
	gtk_widget_queue_draw(widget);
	
    GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);	// 创建图片资源对象
    // w, h是指定图片的宽度和高度
    GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);

	GdkPixmap *pixmap = NULL;
	
	/* 创建pixmap图像; 
	 * NULL：不需要蒙版; 
	 * 123： 0~255，透明到不透明
	 */
    gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
    // 通过pixmap给widget设置一张背景图，最后一个参数必须为: FASLE
	gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
    
	// 释放资源
	g_object_unref(src_pixbuf);
    g_object_unref(dst_pixbuf);
    g_object_unref(pixmap);
}/*}}}*/

 /* 功能:      设置控件字体大小
  * widget:    需要改变字体的控件
  * size:      字体大小
  * is_button: TRUE代表控件为按钮，FALSE为其它控件
  */
static void set_widget_font_size(GtkWidget *widget, int size, gboolean is_button)/*{{{*/
{
	GtkWidget *labelChild;  
	PangoFontDescription *font;  
	gint fontSize = size;  
  
	font = pango_font_description_from_string("Sans");          //"Sans"字体名   
	pango_font_description_set_size(font, fontSize*PANGO_SCALE);//设置字体大小   
	
	if(is_button){
		labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton里的label  
	}else{
		labelChild = widget;
	}
	
	//设置label的字体，这样这个GtkButton上面显示的字体就变了
	gtk_widget_modify_font(GTK_WIDGET(labelChild), font);
	pango_font_description_free(font);
}/*}}}*/

// 给创建好的image重新设计一张图片
void load_image(GtkWidget *image, const char *file_path, const int w, const int h )/*{{{*/
{
	gtk_image_clear( GTK_IMAGE(image) );        // 清除图像
	GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(file_path, NULL);	// 创建图片资源
	GdkPixbuf *dest_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR); // 指定大小
	gtk_image_set_from_pixbuf(GTK_IMAGE(image), dest_pixbuf); // 图片控件重新设置一张图片(pixbuf)
	g_object_unref(src_pixbuf);		// 释放资源
	g_object_unref(dest_pixbuf);	// 释放资源
}/*}}}*/

/***********************************************
* 函数功能:设置窗口显示字体颜色
* 参数类型:widget:需要改变颜色的控件
				color_buf:设置字体颜色，如"red"、"blue"
				is_button:是否为button
* 返回类型:成功返回0，失败返回-1
* 维护记录:2013-12-18 by lihuibo
***********************************************/
int sungtk_widget_set_font_color(GtkWidget *widget, const char *color_buf, gboolean is_button)/*{{{*/
{
	if(widget == NULL && color_buf==NULL)
		return -1;
	
	GdkColor color;
	GtkWidget *labelChild = NULL;
	sungtk_color_get(color_buf, &color);
	if(is_button == TRUE){
		labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton里的label  
		gtk_widget_modify_fg(labelChild, GTK_STATE_NORMAL, &color);
		gtk_widget_modify_fg(labelChild, GTK_STATE_SELECTED, &color);
		gtk_widget_modify_fg(labelChild, GTK_STATE_PRELIGHT, &color);
	}else{
		gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color);
	}
	return 0;
}/*}}}*/

